package com.jaeke.aop;

import com.jaeke.transaction.TransactionUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;

// 切面类  基于手动事物封装
@Component
@Aspect
public class AopTransaction {

    @Autowired
    private TransactionUtils transactionUtils;


    // 环绕通知 在方法之前和之后处理事情
    @Around("execution(* com.jaeke.service.UserService.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("开启事务！");

        TransactionStatus transactionStatus = transactionUtils.begin();
        // 在调用方法之前执行
        proceedingJoinPoint.proceed();  // 代理调用方法  注意点：如果调用方法抛出异常 则不会执行后面代码
        // 在调用方法之后执行
        System.out.println("提交事物！");
        transactionUtils.commit(transactionStatus);


    }



}
